{"beispielaufgaben":[{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"Ein kommunaler Betreiber öffentlicher Ladesäulen für Elektrofahrzeuge möchte die Nutzung seiner Standorte auswerten. Jeder abgeschlossene Ladevorgang wird als Objekt der Klasse Ladevorgang gespeichert.","typ":"absatz"},{"text":"Klasse Ladevorgang\n- saeuleId : Integer      // Kennung der genutzten Ladesäule\n- kwh : Double            // geladene Energiemenge in Kilowattstunden\n- dauerMin : Integer      // Dauer des Ladevorgangs in Minuten\nFür jedes Attribut existiert eine öffentliche get-Methode (getSaeuleId(), getKwh(), getDauerMin()).","typ":"absatz"},{"text":"Alle Ladevorgänge eines Monats liegen in einer generischen Liste List<Ladevorgang> vorgaenge vor. Zu einer Ladesäule können mehrere Ladevorgänge gehören; die Liste ist unsortiert und kann leer sein.","typ":"absatz"},{"text":"Das Ergebnis soll je Ladesäule in einem Objekt der Klasse SaeuleData zusammengefasst werden.","typ":"absatz"},{"text":"Klasse SaeuleData\n- saeuleId : Integer\n- anzahl : Integer        // Anzahl der Ladevorgänge dieser Säule\n- summeKwh : Double       // Summe der geladenen Energie dieser Säule\n+ SaeuleData(saeuleId : Integer, anzahl : Integer, summeKwh : Double)\n+ getSaeuleId() : Integer\n+ getAnzahl() : Integer\n+ setAnzahl(a : Integer) : void\n+ getSummeKwh() : Double\n+ setSummeKwh(s : Double) : void","typ":"absatz"},{"text":"Für generische Listen List<T> stehen add(t : T) : void, size() : Integer und get(i : Integer) : T zur Verfügung.","typ":"absatz"},{"text":"Entwickeln Sie in strukturiertem, sprachneutralem Pseudocode die Methode","typ":"absatz"},{"text":"List<SaeuleData> erzeugeSaeuleData(List<Ladevorgang> vorgaenge)","typ":"absatz"},{"text":"nach folgenden Regeln:","typ":"ueberschrift"},{"eintraege":["Für jede in vorgaenge vorkommende saeuleId wird genau ein SaeuleData-Objekt erzeugt und der Ergebnisliste hinzugefügt; keine saeuleId darf doppelt in der Ergebnisliste auftreten.","Das Attribut anzahl enthält die Anzahl der Ladevorgänge der jeweiligen Säule, summeKwh die Summe der zugehörigen kwh-Werte.","Die Reihenfolge der Ergebnisliste ist beliebig.","Ist vorgaenge leer, wird eine leere Liste zurückgegeben."],"typ":"liste"},{"text":"Geben Sie die vollständige Methode einschließlich Signatur und Rückgabe an.","typ":"absatz"}],"beispiel_id":"bsp-algorithmusentwurf-erstellen-quellcode-01","freigabeart":"maschinell","loesung":[{"text":"Erwartete Lösung (Pseudocode, andere korrekte Lösungen möglich):\nList<SaeuleData> erzeugeSaeuleData(List<Ladevorgang> vorgaenge)\n  List<SaeuleData> ergebnis = new List<SaeuleData>()\n  fuer i von 0 bis vorgaenge.size()-1\n    Ladevorgang v = vorgaenge.get(i)\n    SaeuleData treffer = null\n    fuer j von 0 bis ergebnis.size()-1\n      wenn ergebnis.get(j).getSaeuleId() == v.getSaeuleId()\n        treffer = ergebnis.get(j)\n    wenn treffer == null\n      treffer = new SaeuleData(v.getSaeuleId(), 0, 0.0)\n      ergebnis.add(treffer)\n    treffer.setAnzahl(treffer.getAnzahl() + 1)\n    treffer.setSummeKwh(treffer.getSummeKwh() + v.getKwh())\n  Rueckgabe ergebnis","typ":"code"},{"text":"Punkteverteilung (20): Signatur, Initialisierung Ergebnisliste und Rueckgabe 3; korrekte Iteration ueber vorgaenge 3; Suche nach bereits vorhandenem SaeuleData zur saeuleId (Duplikatvermeidung) 5; Neuanlage und Hinzufuegen eines SaeuleData-Objekts 4; korrektes Hochzaehlen von anzahl 2; korrektes Aufsummieren von summeKwh 3. Leere Liste ergibt korrekt leere Rueckgabe (in obiger Struktur enthalten). Abzug bei Doppeleintraegen je saeuleId oder fehlender Aggregation.","typ":"absatz"}],"operator_id":"operator.erstellen","pruefungszuordnung":{"berufe":["FIAE","FIDP"],"teil":"AP2"},"punkte":20,"punkterahmen":{"max":25,"min":4},"quellen":["ap1-2022-herbst-gesamt-a04-b","ap2-fiae-2021-winter-ae2-a02","ap2-fiae-2022-sommer-ae1-a03-c-cb","ap2-fiae-2022-sommer-ae2-a01","ap2-fiae-2022-winter-ae2-a01-a","ap2-fiae-2022-winter-ae2-a01-b","ap2-fiae-2022-winter-ae2-a02-c","ap2-fiae-2023-sommer-ae1-a02-b-bc","ap2-fiae-2023-sommer-ae2-a02","ap2-fiae-2024-sommer-ae1-a03-b-ba","ap2-fiae-2024-sommer-ae1-a03-b-bb","ap2-fiae-2024-sommer-ae1-a03-b-bc","ap2-fiae-2024-sommer-ae2-a02-a","ap2-fiae-2024-sommer-ae2-a02-b","ap2-fiae-2024-winter-ae1-a02-c","ap2-fiae-2024-winter-ae2-a01","ap2-fiae-2025-sommer-ae2-a01","ap2-fiae-2025-winter-ae2-a01-a","ap2-fiae-2025-winter-ae2-a01-b","ap2-fiae-2026-sommer-ae2-a01-a","ap2-fiae-2026-sommer-ae2-a01-b","ap2-fiae-2026-sommer-ae2-a02-b-ba","ap2-fidp-2023-sommer-fdp1-a02-a"]},{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"Für ein Programmkino soll eine Funktion die Verfügbarkeit von Sitzplätzen prüfen. Jeder Saal besitzt einen Sitzplan, der als zweidimensionales Integer-Array vorliegt. Jede Zeile des Arrays steht für eine Sitzreihe, jede Spalte für einen Sitz innerhalb dieser Reihe. Ein Eintrag hat den Wert 1, wenn der Platz belegt ist, und 0, wenn er frei ist.","typ":"absatz"},{"text":"Für den Zugriff steht folgende Funktion bereits zur Verfügung:\ngetSitzplan(saalId : Integer) : 2-dim-Integer-Array | Liefert zur übergebenen Saal-ID den zugehörigen Sitzplan.","typ":"absatz"},{"text":"Für ein zweidimensionales Array plan liefert plan[reihe].length die Anzahl der Sitze in der Zeile reihe. Die übergebenen Werte reihe und sitz liegen stets innerhalb des Plans; sitz kann zusätzlich den Wert -1 haben.","typ":"absatz"},{"text":"Entwickeln Sie in strukturiertem, sprachneutralem Pseudocode die Funktion","typ":"absatz"},{"text":"findePlatz(reihe : Integer, sitz : Integer, saalId : Integer) : boolean","typ":"absatz"},{"text":"nach folgenden Regeln:","typ":"ueberschrift"},{"eintraege":["Zunächst ist der Sitzplan des Saals über getSitzplan(saalId) zu beschaffen.","Ist sitz ungleich -1, so ist genau der Platz plan[reihe][sitz] zu prüfen: Die Funktion gibt true zurück, wenn dieser Platz frei ist (Wert 0), sonst false.","Hat sitz den Wert -1, so ist kein bestimmter Platz vorgegeben: Es sind alle Sitze der Reihe reihe zu durchsuchen. Die Funktion gibt true zurück, sobald ein freier Platz (Wert 0) gefunden wird, andernfalls false."],"typ":"liste"},{"text":"Geben Sie die vollständige Funktion einschließlich Signatur und aller Rückgaben an.","typ":"absatz"}],"beispiel_id":"bsp-algorithmusentwurf-erstellen-quellcode-02","freigabeart":"maschinell","loesung":[{"text":"Erwartete Lösung (Pseudocode, andere korrekte Lösungen möglich):\nfindePlatz(reihe : Integer, sitz : Integer, saalId : Integer) : boolean\n  plan = getSitzplan(saalId)\n  wenn sitz != -1\n    wenn plan[reihe][sitz] == 0\n      Rueckgabe true\n    sonst\n      Rueckgabe false\n  sonst\n    fuer s von 0 bis plan[reihe].length-1\n      wenn plan[reihe][s] == 0\n        Rueckgabe true\n    Rueckgabe false","typ":"code"},{"text":"Punkteverteilung (15): Signatur und Beschaffung des Sitzplans ueber getSitzplan 2; Fallunterscheidung sitz != -1 mit korrekter Pruefung des Einzelplatzes und beiden Rueckgaben (true/false) 5; Durchlaufen aller Sitze der Reihe im Fall sitz == -1 5; Rueckgabe true beim ersten freien Platz 2; Rueckgabe false, wenn kein freier Platz gefunden 1. Abzug bei falscher Behandlung des -1-Falls oder verwechselter 0/1-Bedeutung.","typ":"absatz"}],"operator_id":"operator.erstellen","pruefungszuordnung":{"berufe":["FIAE","FIDP"],"teil":"AP2"},"punkte":15,"punkterahmen":{"max":25,"min":4},"quellen":["ap1-2022-herbst-gesamt-a04-b","ap2-fiae-2021-winter-ae2-a02","ap2-fiae-2022-sommer-ae1-a03-c-cb","ap2-fiae-2022-sommer-ae2-a01","ap2-fiae-2022-winter-ae2-a01-a","ap2-fiae-2022-winter-ae2-a01-b","ap2-fiae-2022-winter-ae2-a02-c","ap2-fiae-2023-sommer-ae1-a02-b-bc","ap2-fiae-2023-sommer-ae2-a02","ap2-fiae-2024-sommer-ae1-a03-b-ba","ap2-fiae-2024-sommer-ae1-a03-b-bb","ap2-fiae-2024-sommer-ae1-a03-b-bc","ap2-fiae-2024-sommer-ae2-a02-a","ap2-fiae-2024-sommer-ae2-a02-b","ap2-fiae-2024-winter-ae1-a02-c","ap2-fiae-2024-winter-ae2-a01","ap2-fiae-2025-sommer-ae2-a01","ap2-fiae-2025-winter-ae2-a01-a","ap2-fiae-2025-winter-ae2-a01-b","ap2-fiae-2026-sommer-ae2-a01-a","ap2-fiae-2026-sommer-ae2-a01-b","ap2-fiae-2026-sommer-ae2-a02-b-ba","ap2-fidp-2023-sommer-fdp1-a02-a"]},{"artefakt_id":"artefakt.quellcode","aufgabe":[{"text":"Die Stadtwerke einer Kommune betreiben ein Luftmessnetz mit mehreren fest installierten Feinstaub-Sensoren. Für eine Auswerte-Software soll eine Funktion in Pseudocode erstellt werden, die aus einer Reihe von Einzelmessungen diejenige Messstation ermittelt, an der ein festgelegter Grenzwert am häufigsten überschritten wurde.","typ":"absatz"},{"text":"Es stehen folgende Datenstrukturen zur Verfügung:","typ":"ueberschrift"},{"text":"Klasse Messung\n- stationId : Integer   // Kennung der Messstation\n- wert : Double         // gemessene Feinstaubkonzentration\nFür jedes Attribut existiert eine öffentliche get-Methode (getStationId(), getWert()).","typ":"absatz"},{"text":"Die zu betrachtenden Messwerte liegen in einem eindimensionalen Array messungen vom Typ Messung vor. In einem eindimensionalen Array stationIds vom Typ Integer sind die Kennungen aller auszuwertenden Stationen genau einmal gespeichert.","typ":"absatz"},{"text":"Zu erstellen ist folgende Funktion:\nermittleKritischsteStation(messungen : Messung[], grenzwert : Double, stationIds : Integer[]) : Integer","typ":"absatz"},{"text":"Regeln:","typ":"ueberschrift"},{"eintraege":["Eine Messung gilt als Überschreitung, wenn ihr wert echt größer als grenzwert ist.","Für jede Kennung aus stationIds ist die Anzahl der Überschreitungen zu bestimmen, deren stationId dieser Kennung entspricht.","Zurückzugeben ist die stationId mit der höchsten Anzahl an Überschreitungen."],"typ":"liste"},{"text":"Zugesichert wird: Beide Arrays sind nicht leer, jede in messungen vorkommende stationId ist in stationIds enthalten, und genau eine Station weist die höchste Anzahl an Überschreitungen auf.","typ":"absatz"},{"text":"Verwenden Sie ausschließlich Arrays, die Zählvariablen sowie for- bzw. foreach-Schleifen, if-Abfragen, array.length, arithmetische Operatoren und Vergleichsoperatoren. Weitere Bibliotheksfunktionen sowie Listen-, Map- oder Sortierfunktionen sind nicht zugelassen.","typ":"absatz"}],"beispiel_id":"bsp-algorithmusentwurf-erstellen-quellcode-03","freigabeart":"maschinell","loesung":[{"text":"Erwartete Lösung (Pseudocode, andere korrekte Umsetzungen im vorgegebenen Rahmen sind zulässig):","typ":"absatz"},{"text":"ermittleKritischsteStation(messungen : Messung[], grenzwert : Double, stationIds : Integer[]) : Integer {\n  Integer[] zaehler = new Integer[stationIds.length]\n  for (int k = 0; k < stationIds.length; k++) { zaehler[k] = 0 }\n  for (int i = 0; i < messungen.length; i++) {\n    if (messungen[i].getWert() > grenzwert) {\n      for (int k = 0; k < stationIds.length; k++) {\n        if (messungen[i].getStationId() == stationIds[k]) { zaehler[k] = zaehler[k] + 1 }\n      }\n    }\n  }\n  int maxIndex = 0\n  for (int k = 1; k < stationIds.length; k++) {\n    if (zaehler[k] > zaehler[maxIndex]) { maxIndex = k }\n  }\n  return stationIds[maxIndex]\n}","typ":"code"},{"text":"Punkteverteilung (15):","typ":"ueberschrift"},{"eintraege":["Korrekte Signatur und Rückgabetyp Integer: 2 P.","Paralleles Zähler-Array passend zu stationIds angelegt und mit 0 initialisiert: 2 P.","Durchlauf aller Messungen im Array: 2 P.","Korrekte Überschreitungsbedingung wert > grenzwert (echt größer): 3 P.","Zuordnung einer Überschreitung zur passenden stationId (Abgleich mit stationIds) und Inkrement: 3 P.","Ermittlung des Maximums der Zähler: 2 P.","Rückgabe der stationId mit der höchsten Anzahl: 1 P."],"typ":"liste"},{"text":"Hinweise für die Korrektur: Da genau eine Station als Maximum zugesichert ist, ist keine Sonderbehandlung von Gleichständen zu fordern. Lösungen mit Listen, Maps oder Sortier-/Bibliotheksfunktionen sind nicht zugelassen und nicht als gleichwertig zu bewerten. Verwendung von >= oder < statt > bei der Grenzwertprüfung ist ein fachlicher Fehler (Abzug bei der Bedingung).","typ":"absatz"}],"operator_id":"operator.erstellen","pruefungszuordnung":{"berufe":["FIAE","FIDP"],"teil":"AP2"},"punkte":15,"punkterahmen":{"max":25,"min":4},"quellen":["ap1-2022-herbst-gesamt-a04-b","ap2-fiae-2021-winter-ae2-a02","ap2-fiae-2022-sommer-ae1-a03-c-cb","ap2-fiae-2022-sommer-ae2-a01","ap2-fiae-2022-winter-ae2-a01-a","ap2-fiae-2022-winter-ae2-a01-b","ap2-fiae-2022-winter-ae2-a02-c","ap2-fiae-2023-sommer-ae1-a02-b-bc","ap2-fiae-2023-sommer-ae2-a02","ap2-fiae-2024-sommer-ae1-a03-b-ba","ap2-fiae-2024-sommer-ae1-a03-b-bb","ap2-fiae-2024-sommer-ae1-a03-b-bc","ap2-fiae-2024-sommer-ae2-a02-a","ap2-fiae-2024-sommer-ae2-a02-b","ap2-fiae-2024-winter-ae1-a02-c","ap2-fiae-2024-winter-ae2-a01","ap2-fiae-2025-sommer-ae2-a01","ap2-fiae-2025-winter-ae2-a01-a","ap2-fiae-2025-winter-ae2-a01-b","ap2-fiae-2026-sommer-ae2-a01-a","ap2-fiae-2026-sommer-ae2-a01-b","ap2-fiae-2026-sommer-ae2-a02-b-ba","ap2-fidp-2023-sommer-fdp1-a02-a"]},{"artefakt_id":"artefakt.tabelle","aufgabe":[{"text":"In einem Einzelhandelsgeschäft soll ein Algorithmus die Endsumme eines Einkaufs mit einem Mengenrabatt bestimmen. Übergeben wird ein Array artikel vom Typ Artikel; die Methode getPreis() liefert den Einzelpreis eines Artikels in Euro. Der Algorithmus durchläuft alle Artikel und bildet eine Gesamtsumme, die mit 0.0 beginnt. Kostet ein Artikel 50 Euro oder mehr, wird sein Preis mit dem Faktor 0.9 vermindert zur Summe addiert, andernfalls fließt der volle Preis ein. Nach dem Durchlauf gibt die Funktion die Gesamtsumme zurück. Der folgende Pseudocode bildet diesen Ablauf vollständig ab, doch acht Anweisungen fehlen. Nennen Sie für jede leere Zelle die fehlende Anweisung und tragen Sie je Zelle genau einen Eintrag ein.","typ":"absatz"},{"kopf":["Nr.","Anweisung (Pseudocode)"],"typ":"tabelle","zeilen":[["1","berechneRechnung(artikel : Artikel[]) : Double"],["2",""],["3",""],["4","preis = artikel[i].getPreis()"],["5",""],["6",""],["7","sonst"],["8",""],["9",""],["10",""],["11",""],["12","ende berechneRechnung"]]}],"beispiel_id":"bsp-algorithmusentwurf-nennen-tabelle-01","freigabeart":"maschinell","loesung":[{"text":"Je korrekt genannte Anweisung 1 Punkt (8 Zellen = 8 Punkte). Je Zelle zählt nur der erste Eintrag; fachlich gleichwertige Schreibweisen (andere Schleifen-, Vergleichs- oder Zuweisungsnotation) sind anzuerkennen.","typ":"absatz"},{"kopf":["Nr.","Anweisung (Pseudocode)","Punkte"],"typ":"tabelle","zeilen":[["1","berechneRechnung(artikel : Artikel[]) : Double","vorgegeben"],["2","summe = 0.0","1"],["3","für i = 0 bis artikel.length - 1","1"],["4","preis = artikel[i].getPreis()","vorgegeben"],["5","wenn preis >= 50","1"],["6","summe = summe + preis * 0.9","1"],["7","sonst","vorgegeben"],["8","summe = summe + preis","1"],["9","ende wenn","1"],["10","ende für","1"],["11","Rückgabe summe","1"],["12","ende berechneRechnung","vorgegeben"]]},{"text":"Summe: 8 Punkte.","typ":"absatz"}],"operator_id":"operator.nennen","pruefungszuordnung":{"berufe":["FIDP"],"teil":"AP2"},"punkte":8,"punkterahmen":{"max":8,"min":8},"quellen":["ap2-fidp-2026-sommer-fdp2-a02-b"]},{"artefakt_id":"artefakt.tabelle","aufgabe":[{"text":"Ein Onlinehändler möchte den Einkaufswert der fälligen Nachbestellungen automatisch bestimmen. Übergeben wird ein Array artikel vom Typ Artikel. Für jeden Artikel liefern getBestand() den aktuellen Lagerbestand, getMindestbestand() die untere Bestandsgrenze und getPreis() den Einkaufspreis je Stück in Euro. Der Algorithmus prüft jeden Artikel: Liegt der Bestand unter dem Mindestbestand, wird die Fehlmenge als Differenz aus Mindestbestand und Bestand ermittelt, mit dem Preis multipliziert und auf einen Gesamtwert addiert, der mit 0.0 beginnt. Artikel mit ausreichendem Bestand bleiben unberücksichtigt. Am Ende gibt die Funktion den Gesamtwert zurück. Im folgenden Pseudocode fehlen acht Anweisungen. Nennen Sie für jede leere Zelle genau eine fehlende Anweisung und tragen Sie je Zelle nur einen Eintrag ein.","typ":"absatz"},{"kopf":["Nr.","Anweisung (Pseudocode)"],"typ":"tabelle","zeilen":[["1","berechneNachbestellwert(artikel : Artikel[]) : Double"],["2",""],["3",""],["4","bestand = artikel[i].getBestand()"],["5",""],["6",""],["7",""],["8",""],["9","ende wenn"],["10",""],["11",""],["12","ende berechneNachbestellwert"]]}],"beispiel_id":"bsp-algorithmusentwurf-nennen-tabelle-02","freigabeart":"maschinell","loesung":[{"text":"Je korrekt genannte Anweisung 1 Punkt (8 Zellen = 8 Punkte). Je Zelle zählt nur der erste Eintrag; fachlich gleichwertige Formulierungen sind anzuerkennen.","typ":"absatz"},{"kopf":["Nr.","Anweisung (Pseudocode)","Punkte"],"typ":"tabelle","zeilen":[["1","berechneNachbestellwert(artikel : Artikel[]) : Double","vorgegeben"],["2","wert = 0.0","1"],["3","für i = 0 bis artikel.length - 1","1"],["4","bestand = artikel[i].getBestand()","vorgegeben"],["5","minimum = artikel[i].getMindestbestand()","1"],["6","wenn bestand < minimum","1"],["7","fehlmenge = minimum - bestand","1"],["8","wert = wert + fehlmenge * artikel[i].getPreis()","1"],["9","ende wenn","vorgegeben"],["10","ende für","1"],["11","Rückgabe wert","1"],["12","ende berechneNachbestellwert","vorgegeben"]]},{"text":"Summe: 8 Punkte.","typ":"absatz"}],"operator_id":"operator.nennen","pruefungszuordnung":{"berufe":["FIDP"],"teil":"AP2"},"punkte":8,"punkterahmen":{"max":8,"min":8},"quellen":["ap2-fidp-2026-sommer-fdp2-a02-b"]},{"artefakt_id":"artefakt.tabelle","aufgabe":[{"text":"Eine Photovoltaikanlage speichert Messwerte in einem Array messungen vom Typ Messung. Für jede Messung liefert getWert() den erzeugten Ertrag in Kilowattstunden und getStatus() eine Kennzahl, wobei der Wert 1 eine gültige Messung bezeichnet. Gesucht ist der Durchschnittsertrag über alle gültigen Messungen. Der Algorithmus summiert die Erträge gültiger Messungen und zählt ihre Anzahl; beide Größen beginnen bei 0. Enthält das Array keine gültige Messung, soll die Funktion den Wert 0.0 zurückgeben, andernfalls die Summe geteilt durch die Anzahl. Im folgenden Pseudocode fehlen acht Anweisungen. Nennen Sie für jede leere Zelle die fehlende Anweisung und tragen Sie je Zelle genau einen Eintrag ein.","typ":"absatz"},{"kopf":["Nr.","Anweisung (Pseudocode)"],"typ":"tabelle","zeilen":[["1","berechneDurchschnitt(messungen : Messung[]) : Double"],["2",""],["3",""],["4","für i = 0 bis messungen.length - 1"],["5",""],["6",""],["7",""],["8","ende wenn"],["9",""],["10","wenn anzahl == 0"],["11",""],["12","ende wenn"],["13",""],["14","ende berechneDurchschnitt"]]}],"beispiel_id":"bsp-algorithmusentwurf-nennen-tabelle-03","freigabeart":"maschinell","loesung":[{"text":"Je korrekt genannte Anweisung 1 Punkt (8 Zellen = 8 Punkte). Je Zelle zählt nur der erste Eintrag; fachlich gleichwertige Schreibweisen sind anzuerkennen.","typ":"absatz"},{"kopf":["Nr.","Anweisung (Pseudocode)","Punkte"],"typ":"tabelle","zeilen":[["1","berechneDurchschnitt(messungen : Messung[]) : Double","vorgegeben"],["2","summe = 0.0","1"],["3","anzahl = 0","1"],["4","für i = 0 bis messungen.length - 1","vorgegeben"],["5","wenn messungen[i].getStatus() == 1","1"],["6","summe = summe + messungen[i].getWert()","1"],["7","anzahl = anzahl + 1","1"],["8","ende wenn","vorgegeben"],["9","ende für","1"],["10","wenn anzahl == 0","vorgegeben"],["11","Rückgabe 0.0","1"],["12","ende wenn","vorgegeben"],["13","Rückgabe summe / anzahl","1"],["14","ende berechneDurchschnitt","vorgegeben"]]},{"text":"Summe: 8 Punkte.","typ":"absatz"}],"operator_id":"operator.nennen","pruefungszuordnung":{"berufe":["FIDP"],"teil":"AP2"},"punkte":8,"punkterahmen":{"max":8,"min":8},"quellen":["ap2-fidp-2026-sommer-fdp2-a02-b"]},{"artefakt_id":"artefakt.diagramm","aufgabe":[{"text":"Szenario: Ein Getränkefachgroßhandel rechnet Sammelbestellungen an einem Verkaufsterminal automatisch ab. Der abgebildete Ablauf ermittelt den zu zahlenden Endbetrag einer Bestellung.","typ":"absatz"},{"text":"Gegebene Regeln: Eingegeben werden die Anzahl bestellter Kisten kisten (ganze Zahl von 1 bis 500) und der Stückpreis je Kiste preis (positiver Eurobetrag). Der Warenwert ist die Anzahl der Kisten multipliziert mit dem Stückpreis. Ab einschließlich 50 Kisten wird ein Mengenrabatt von 15 % auf den Warenwert gewährt, sonst kein Rabatt. Der Endbetrag ergibt sich zunächst aus Warenwert abzüglich Rabatt. Beträgt dieser Wert mehr als 1000 Euro, entfällt die Versandpauschale; andernfalls werden 25 Euro Versandpauschale hinzugerechnet. Ausgegeben wird der Endbetrag in Euro.","typ":"absatz"},{"text":"Struktur des Ablaufdiagramms (Start und Ende, alle Kanten, Zweigbeschriftungen und Knotentypen sind vorgegeben). Ergänzen Sie ausschließlich die neun nummerierten leeren Knoten:","typ":"absatz"},{"text":"Start\n(1) [Ein-/Ausgabe] ______\n(2) [Verarbeitung] ______\n<3> [Entscheidung] ______ ?\n– ja  → (4) [Verarbeitung] ______\n– nein → (5) [Verarbeitung] ______\n(Zusammenführung der Zweige)\n(6) [Verarbeitung] ______\n<7> [Entscheidung] ______ ?\n– nein → (8) [Verarbeitung] ______\n– ja  → direkt weiter (Zusammenführung)\n(9) [Ein-/Ausgabe] ______\nEnde","typ":"absatz"},{"text":"Rollen der Knoten: (1) Eingabe von kisten und preis; (2) Warenwert berechnen; (3) Mengenschwelle prüfen; (4) Rabatt bei erreichter Schwelle berechnen; (5) Rabatt ohne Schwelle festlegen; (6) Endbetrag aus Warenwert und Rabatt bilden; (7) Versandkostenfreigrenze prüfen; (8) Versandpauschale addieren; (9) Endbetrag ausgeben. Füllen Sie nur diese neun Knoten aus; der Ablauf selbst ist nicht zu verändern.","typ":"absatz"}],"beispiel_id":"bsp-algorithmusentwurf-ausfuellen-diagramm-01","freigabeart":"maschinell","loesung":[{"text":"Lösung (je Knoten 1 Punkt, insgesamt 9 Punkte):\n(1) Eingabe kisten, preis\n(2) warenwert = kisten * preis\n(3) kisten >= 50 ?\n(4) rabatt = warenwert * 0.15\n(5) rabatt = 0\n(6) endbetrag = warenwert - rabatt\n(7) endbetrag > 1000 ?\n(8) endbetrag = endbetrag + 25\n(9) Ausgabe endbetrag","typ":"absatz"},{"text":"Bewertung: Pro korrekt gefülltem Knoten 1 Punkt. Fachlich gleichwertige Formulierungen gleicher Ablauflogik sind anzuerkennen, z. B. andere Variablennamen, `kisten < 50` mit vertauschten Zweigen bei (3) oder der Rabattfaktor 0,15 als Prozentrechnung. Bei (5) genügt jede Festlegung des Rabatts auf 0; bei (8) jede Addition von 25 Euro auf den Endbetrag.","typ":"absatz"}],"operator_id":"operator.ausfuellen","pruefungszuordnung":{"berufe":[],"teil":"AP1"},"punkte":9,"punkterahmen":{"max":9,"min":9},"quellen":["ap1-2022-fruehjahr-gesamt-a04-d"]},{"artefakt_id":"artefakt.diagramm","aufgabe":[{"text":"Szenario: In einer mechanischen Fertigung werden gedrehte Bolzen einer Charge vermessen. Der abgebildete Ablauf bestimmt den Ausschussanteil in Prozent.","typ":"absatz"},{"text":"Gegebene Regeln: Eingegeben werden das Feld messwerte mit anzahl gemessenen Längen in Millimeter (positive Werte) sowie das Sollmaß soll in Millimeter. anzahl ist eine ganze Zahl von 1 bis 200, die Feldindizes laufen von 0 bis anzahl-1. Ein Bolzen gilt als Ausschuss, wenn der Betrag seiner Abweichung vom Sollmaß größer als 0,5 mm ist. Gezählt wird die Anzahl der Ausschussbolzen. Der Ausschussanteil ergibt sich als Ausschussanzahl geteilt durch anzahl, multipliziert mit 100. Ausgegeben wird der Ausschussanteil in Prozent.","typ":"absatz"},{"text":"Struktur des Ablaufdiagramms (Start und Ende, alle Kanten, Zweigbeschriftungen und Knotentypen sind vorgegeben; <4> ist der Schleifenkopf). Ergänzen Sie ausschließlich die neun nummerierten leeren Knoten:","typ":"absatz"},{"text":"Start\n(1) [Ein-/Ausgabe] ______\n(2) [Verarbeitung] ______\n(3) [Verarbeitung] ______\n<4> [Entscheidung] ______ ?\n– nein → (8) [Verarbeitung] ______\n– ja  → <5> [Entscheidung] ______ ?\n– ja  → (6) [Verarbeitung] ______\n– nein → (weiter zu 7)\n(Zusammenführung)\n(7) [Verarbeitung] ______  → zurück zu <4>\n(9) [Ein-/Ausgabe] ______\nEnde","typ":"absatz"},{"text":"Rollen der Knoten: (1) Eingabe von messwerte, anzahl und soll; (2) Ausschusszähler initialisieren; (3) Laufvariable initialisieren; (4) Schleifenbedingung prüfen; (5) prüfen, ob der aktuelle Bolzen außerhalb der Toleranz liegt; (6) Ausschusszähler erhöhen; (7) Laufvariable erhöhen; (8) Ausschussanteil berechnen; (9) Ausschussanteil ausgeben. Füllen Sie nur diese neun Knoten aus; der Ablauf selbst ist nicht zu verändern.","typ":"absatz"}],"beispiel_id":"bsp-algorithmusentwurf-ausfuellen-diagramm-02","freigabeart":"maschinell","loesung":[{"text":"Lösung (je Knoten 1 Punkt, insgesamt 9 Punkte):\n(1) Eingabe messwerte, anzahl, soll\n(2) ausschuss = 0\n(3) i = 0\n(4) i < anzahl ?\n(5) |messwerte[i] - soll| > 0.5 ?\n(6) ausschuss = ausschuss + 1\n(7) i = i + 1\n(8) quote = ausschuss / anzahl * 100\n(9) Ausgabe quote","typ":"absatz"},{"text":"Bewertung: Pro korrekt gefülltem Knoten 1 Punkt. Fachlich gleichwertige Formulierungen gleicher Ablauflogik sind anzuerkennen, etwa die Betragsbildung als `messwerte[i] - soll > 0.5 ODER soll - messwerte[i] > 0.5` bei (5) oder eine gleichwertige Prozentberechnung bei (8). Knoten (7) muss die Laufvariable in jedem Durchlauf erhöhen.","typ":"absatz"}],"operator_id":"operator.ausfuellen","pruefungszuordnung":{"berufe":[],"teil":"AP1"},"punkte":9,"punkterahmen":{"max":9,"min":9},"quellen":["ap1-2022-fruehjahr-gesamt-a04-d"]},{"artefakt_id":"artefakt.diagramm","aufgabe":[{"text":"Szenario: Ein Carsharing-Anbieter berechnet am Bordcomputer die Kosten einer beendeten Fahrt. Der abgebildete Ablauf ermittelt die zu zahlenden Fahrtkosten.","typ":"absatz"},{"text":"Gegebene Regeln: Eingegeben werden die Fahrdauer minuten (ganze Zahl von 1 bis 1440), die gefahrene Strecke km (0 bis 500) und der Wahrheitswert nachtfahrt. Die Grundkosten betragen 0,20 Euro je Minute zuzüglich 0,25 Euro je Kilometer. Dauert die Fahrt länger als 120 Minuten, wird ein Langzeitrabatt gewährt, indem die Kosten mit 0,90 multipliziert werden. Bei einer Nachtfahrt werden anschließend 3 Euro Zuschlag addiert. Liegt der so ermittelte Betrag unter 5 Euro, wird stattdessen der Mindestbetrag von 5 Euro berechnet. Ausgegeben werden die Fahrtkosten in Euro.","typ":"absatz"},{"text":"Struktur des Ablaufdiagramms (Start und Ende, alle Kanten, Zweigbeschriftungen und Knotentypen sind vorgegeben). Ergänzen Sie ausschließlich die neun nummerierten leeren Knoten:","typ":"absatz"},{"text":"Start\n(1) [Ein-/Ausgabe] ______\n(2) [Verarbeitung] ______\n<3> [Entscheidung] ______ ?\n– ja  → (4) [Verarbeitung] ______\n– nein → weiter (Zusammenführung)\n<5> [Entscheidung] ______ ?\n– ja  → (6) [Verarbeitung] ______\n– nein → weiter (Zusammenführung)\n<7> [Entscheidung] ______ ?\n– ja  → (8) [Verarbeitung] ______\n– nein → weiter (Zusammenführung)\n(9) [Ein-/Ausgabe] ______\nEnde","typ":"absatz"},{"text":"Rollen der Knoten: (1) Eingabe von minuten, km und nachtfahrt; (2) Grundkosten berechnen; (3) Langzeitgrenze prüfen; (4) Langzeitrabatt anwenden; (5) Nachtfahrt prüfen; (6) Nachtzuschlag addieren; (7) Mindestbetrag prüfen; (8) Kosten auf Mindestbetrag setzen; (9) Fahrtkosten ausgeben. Füllen Sie nur diese neun Knoten aus; der Ablauf selbst ist nicht zu verändern.","typ":"absatz"}],"beispiel_id":"bsp-algorithmusentwurf-ausfuellen-diagramm-03","freigabeart":"maschinell","loesung":[{"text":"Lösung (je Knoten 1 Punkt, insgesamt 9 Punkte):\n(1) Eingabe minuten, km, nachtfahrt\n(2) kosten = minuten * 0.20 + km * 0.25\n(3) minuten > 120 ?\n(4) kosten = kosten * 0.90\n(5) nachtfahrt == wahr ?\n(6) kosten = kosten + 3\n(7) kosten < 5 ?\n(8) kosten = 5\n(9) Ausgabe kosten","typ":"absatz"},{"text":"Bewertung: Pro korrekt gefülltem Knoten 1 Punkt. Fachlich gleichwertige Formulierungen gleicher Ablauflogik sind anzuerkennen, etwa der Rabatt als `kosten - kosten * 0.10` bei (4), `nachtfahrt` ohne expliziten Vergleich bei (5) sowie andere Variablennamen. Knoten (8) muss die Kosten fest auf 5 Euro setzen, nicht addieren.","typ":"absatz"}],"operator_id":"operator.ausfuellen","pruefungszuordnung":{"berufe":[],"teil":"AP1"},"punkte":9,"punkterahmen":{"max":9,"min":9},"quellen":["ap1-2022-fruehjahr-gesamt-a04-d"]},{"artefakt_id":"artefakt.diagramm","aufgabe":[{"text":"In einer Werkstatt werden Fertigungsaufträge digital verwaltet. Für eine Planungsansicht sollen die Aufträge aufsteigend nach ihrer geschätzten Bearbeitungszeit angeordnet werden. Die Aufträge liegen als Array von Werkstueck-Objekten vor. Jedes Werkstueck stellt die Methode getBearbeitungszeit() bereit, die eine ganze Zahl von Minuten liefert. Das Array enthält mindestens ein Element; alle Bearbeitungszeiten sind gültige positive Ganzzahlen.","typ":"absatz"},{"text":"Die Sortierung soll ausschließlich nach folgendem Verfahren erfolgen: Vergleichen Sie jeweils zwei unmittelbar benachbarte Werkstuecke und vertauschen Sie sie, wenn das linke die größere Bearbeitungszeit hat. Beginnen Sie beim ersten und zweiten Element, setzen Sie den Vergleich beim zweiten und dritten Element fort und laufen Sie so bis zum Ende des noch unsortierten Bereichs. Wiederholen Sie diese Durchläufe, bis keine Vertauschung mehr nötig ist beziehungsweise alle Positionen geordnet sind. Das Array wird dabei direkt verändert; eine Rückgabe ist nicht erforderlich.","typ":"absatz"},{"text":"Erstellen Sie den Kontrollfluss der Methode sortiere(werke: Array von Werkstueck) als Programmablaufplan oder Struktogramm. Setzen Sie ausschließlich das beschriebene Verfahren mit wiederholten Durchläufen und dem Vergleich benachbarter Elemente um. Kennzeichnen Sie die beiden Schleifen, die Vergleichs- und Vertauschungsschritte sowie die Fortschaltung der Laufvariablen eindeutig.","typ":"absatz"}],"beispiel_id":"bsp-algorithmusentwurf-erstellen-diagramm-01","freigabeart":"maschinell","loesung":[{"text":"Erwartet wird ein Programmablaufplan oder Struktogramm, das genau das vorgegebene Vertauschungsverfahren benachbarter Elemente mit wiederholten Durchläufen umsetzt. Da der Aufgabentext ausdrücklich nur dieses Verfahren (Vergleich unmittelbar benachbarter Elemente, wiederholte Durchläufe) zulässt, werden abweichende Sortierverfahren hier nicht als gleichwertig anerkannt.\nNachfolgend als Pseudocode dargestellt; PAP und Struktogramm bleiben gleichwertig:","typ":"absatz"},{"text":"sortiere(werke : Array von Werkstueck)\nBeginn\n  i = 0                                                          (Pos. 1)\n  Solange i < werke.Länge - 1:                                   (Pos. 2)\n    j = 0                                                        (Pos. 3)\n    Solange j < werke.Länge - i - 1:                             (Pos. 4)\n      links = werke[j].getBearbeitungszeit()                     (Pos. 5)\n      rechts = werke[j + 1].getBearbeitungszeit()                (Pos. 5)\n      Wenn links > rechts:                                       (Pos. 6)\n        temp = werke[j]                                          (Pos. 7)\n        werke[j] = werke[j + 1]                                  (Pos. 8)\n        werke[j + 1] = temp                                      (Pos. 9)\n      Ende Wenn\n      j = j + 1                                                  (Pos. 10)\n    Ende Solange\n    i = i + 1                                                    (Pos. 10)\n  Ende Solange\nEnde","typ":"code"},{"text":"Punkteverteilung, je 1 Punkt für 10 Positionen: (1) Initialisierung der äußeren Laufvariablen, z. B. i=0; (2) äußere Iterations-/Abbruchbedingung, z. B. i < Länge-1; (3) Initialisierung der inneren Laufvariablen j=0; (4) innere Iterationsbedingung, z. B. j < Länge-i-1; (5) Zugriff auf getBearbeitungszeit() der Elemente an Position j und j+1; (6) Entscheidung, ob werke[j] die größere Bearbeitungszeit als werke[j+1] hat; (7) Zwischenspeichern eines Elements (temp = werke[j]); (8) erste Zuweisung werke[j] = werke[j+1]; (9) zweite Zuweisung werke[j+1] = temp; (10) Fortschaltung der Laufvariablen und korrektes Schleifenende ohne separate Rückgabe. Fachlich gleichwertige Notationen von Zählweise und temp-Tausch sind anzuerkennen, solange benachbarte Elemente verglichen und in wiederholten Durchläufen aufsteigend geordnet werden. Fehlende Positionen führen anteilig zum Punktabzug.","typ":"absatz"}],"operator_id":"operator.erstellen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":10,"punkterahmen":{"max":10,"min":10},"quellen":["ap2-fiae-2022-sommer-ae2-a01","ap2-fiae-2022-winter-ae2-a01-a","ap2-fidp-2023-sommer-fdp1-a02-a"]},{"artefakt_id":"artefakt.diagramm","aufgabe":[{"text":"Ein Betreiber öffentlicher Ladepunkte wertet die Ladevorgänge eines Tages aus. Die Vorgänge liegen als Array von Ladevorgang-Objekten vor. Jeder Ladevorgang stellt zwei Methoden bereit: istAbgeschlossen() liefert einen Wahrheitswert und ist genau dann wahr, wenn der Ladevorgang regulär beendet wurde; getEnergie() liefert die geladene Energiemenge als ganze Zahl in Kilowattstunden. Das Array kann beliebig viele Einträge enthalten und ist stets gültig befüllt.","typ":"absatz"},{"text":"Gesucht ist die höchste geladene Energiemenge unter allen regulär abgeschlossenen Ladevorgängen. Nicht abgeschlossene Vorgänge bleiben unberücksichtigt. Ist im gesamten Array kein einziger Ladevorgang abgeschlossen, soll der Wert -1 zurückgegeben werden; dieser Sonderfall ist ausdrücklich so festgelegt und muss nicht anders behandelt werden.","typ":"absatz"},{"text":"Erstellen Sie den Kontrollfluss der Methode maxEnergie(vorgaenge: Array von Ladevorgang) : Integer als Programmablaufplan oder Struktogramm. Die Methode durchläuft das Array einmal vollständig, prüft für jeden Vorgang den Abschluss, vergleicht die Energiemenge mit dem bisher größten Wert und gibt am Ende das Ergebnis zurück. Kennzeichnen Sie die Initialisierung, die Schleife, die Entscheidung, den Vergleich und die Rückgabe eindeutig.","typ":"absatz"}],"beispiel_id":"bsp-algorithmusentwurf-erstellen-diagramm-02","freigabeart":"maschinell","loesung":[{"text":"Erwartet wird ein Programmablaufplan oder Struktogramm, das das Array in einem Durchlauf verarbeitet und das Maximum der Energiemengen über die abgeschlossenen Vorgänge bestimmt.\nNachfolgend als Pseudocode dargestellt; PAP und Struktogramm bleiben gleichwertig:","typ":"absatz"},{"text":"maxEnergie(vorgaenge : Array von Ladevorgang) : Integer\nBeginn\n  max = -1                                                       (Pos. 1)\n  i = 0                                                          (Pos. 2)\n  Solange i < vorgaenge.Länge:                                   (Pos. 3)\n    vorgang = vorgaenge[i]                                       (Pos. 4)\n    Wenn vorgang.istAbgeschlossen():                             (Pos. 5)\n      energie = vorgang.getEnergie()                             (Pos. 6)\n      Wenn energie > max:                                        (Pos. 7)\n        max = energie                                            (Pos. 8)\n      Ende Wenn\n    Ende Wenn\n    i = i + 1                                                    (Pos. 9)\n  Ende Solange\n  Rückgabe max                                                   (Pos. 10)\nEnde","typ":"code"},{"text":"Punkteverteilung, je 1 Punkt für 10 Positionen: (1) Initialisierung der Ergebnisvariablen mit dem im Aufgabentext ausdrücklich vorgegebenen Startwert -1; (2) Initialisierung der Laufvariablen bzw. Schleifenbeginn, z. B. i=0; (3) Iterationsbedingung, z. B. i < Länge des Arrays; (4) Zugriff auf den aktuellen Ladevorgang vorgaenge[i]; (5) Entscheidung istAbgeschlossen(); (6) Ermitteln der Energiemenge über getEnergie(); (7) Vergleich der Energiemenge mit der Ergebnisvariablen; (8) Zuweisung des neuen Maximalwerts bei größerem Wert; (9) Fortschaltung der Laufvariablen; (10) Rückgabe der Ergebnisvariablen nach der Schleife. Da der Startwert -1 laut Aufgabentext gesetzt ist, ergibt sich die Rückgabe -1 im Fall ohne abgeschlossenen Vorgang unmittelbar aus diesem Wert; ein zusätzlicher gesonderter Prüfzweig ist zulässig, aber nicht erforderlich. Fachlich gleichwertige Notationen sind anzuerkennen; fehlende Positionen führen anteilig zum Punktabzug.","typ":"absatz"}],"operator_id":"operator.erstellen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":10,"punkterahmen":{"max":10,"min":10},"quellen":["ap2-fiae-2022-sommer-ae2-a01","ap2-fiae-2022-winter-ae2-a01-a","ap2-fidp-2023-sommer-fdp1-a02-a"]},{"artefakt_id":"artefakt.diagramm","aufgabe":[{"text":"Bei einem regionalen Volkslauf werden die Ergebnisse elektronisch erfasst. Für die Ergebnisliste sollen die Teilnehmenden aufsteigend nach ihrer Zielzeit sortiert werden, sodass die schnellste Person am Anfang steht. Die Datensätze liegen in einem Array vom Typ Teilnehmer vor.","typ":"absatz"},{"text":"Teilnehmer\n+ getZielzeit() : Integer","typ":"absatz"},{"text":"getZielzeit liefert die benötigte Zeit in vollen Sekunden. Über starter.length ist die Anzahl der Elemente abrufbar; das Array enthält mindestens ein Element. Verwenden Sie ein Auswahlverfahren: Bestimmen Sie in jedem Durchlauf aus dem noch unsortierten Bereich das Element mit der kleinsten Zielzeit und tauschen Sie es über eine Hilfsvariable an den Anfang des unsortierten Bereichs. Wiederholen Sie dies, bis das gesamte Array aufsteigend geordnet ist. Die Methode ändert das Array unmittelbar und liefert keinen Rückgabewert.","typ":"absatz"},{"text":"Signatur: void sortiereTeilnehmer(starter: Array von Teilnehmer)","typ":"absatz"},{"text":"Erstellen Sie den vollständigen Kontrollfluss dieser Methode als Programmablaufplan oder als Struktogramm. Kennzeichnen Sie die Initialisierung, die äußere und die innere Wiederholung, den Vergleich der Zielzeiten, das Merken der kleinsten Position sowie den Tausch. Eine konkrete Programmiersprache, Quellcode oder eine defensive Prüfung bereits zugesicherter Eingaben werden nicht verlangt.","typ":"absatz"}],"beispiel_id":"bsp-algorithmusentwurf-erstellen-diagramm-03","freigabeart":"maschinell","loesung":[{"text":"Erwartete Lösung (Selection Sort; gleichwertige korrekte Auswahlverfahren sind anzuerkennen):\nsortiereTeilnehmer(starter: Array von Teilnehmer)\n  für i = 0 bis starter.length-2\n    minIndex = i\n    für j = i+1 bis starter.length-1\n      wenn starter[j].getZielzeit() < starter[minIndex].getZielzeit()\n        minIndex = j\n      ende wenn\n    ende für\n    Teilnehmer h = starter[i]\n    starter[i] = starter[minIndex]\n    starter[minIndex] = h\n  ende für\nende","typ":"code"},{"text":"Punkteverteilung (5 Positionen zu je 2 Punkten, keine Position über 2 Punkte):\n- Initialisierung und äußere Wiederholung mit Laufindex i: 2\n- Setzen der vermuteten kleinsten Position minIndex = i: 2\n- innere Wiederholung mit Vergleich der Zielzeiten und Aktualisierung von minIndex: 2\n- Tausch des gefundenen Minimums an Position i über eine Hilfsvariable: 2\n- korrekte Schleifengrenzen, Fortschaltung und Ende ohne Rückgabewert: 2 Summe: 10 Punkte. Ein direkt auf dem Array arbeitender Kontrollfluss ohne Rückgabewert genügt.","typ":"absatz"}],"operator_id":"operator.erstellen","pruefungszuordnung":{"berufe":["FIAE"],"teil":"AP2"},"punkte":10,"punkterahmen":{"max":10,"min":10},"quellen":["ap2-fiae-2022-sommer-ae2-a01","ap2-fiae-2022-winter-ae2-a01-a","ap2-fidp-2023-sommer-fdp1-a02-a"]}],"konzept_id":"fachkonzept.algorithmusentwurf","schema_version":3}