📚 LernsiteFach wĂ€hlenKOLEFINAQUBAETFÜDIMAINFEINKMAEL ↗

📋 Übungsaufgaben — alle gelöst (offizielle Musterlösung)

INF — Informatik (Python & Datenbanken) · Prof. Dr. Mehler · ~10 Aufgaben · Python + relationale Datenmodelle

Übungsaufgaben — alle gelöst

Status: GEPRÜFT. Aufgabentexte wörtlich aus „Beispiele Klausuraufgaben V4.1“ (Prof. Mehler, OLAT), Lösungen aus der offiziellen Musterlösung. Jeder Python-Codeblock wurde mit Python 3.12 ausgefĂŒhrt und die Ausgabe verglichen.

Prof. Mehler empfiehlt diese Aufgaben ausdrĂŒcklich als Hauptvorbereitung. Reihenfolge und Punktzahlen wie im Original.

Aufgabe #001 · 7 P. · A1 · Summe ungerader Zahlen (while)Untersucht wird die Aufgabe „Summiere die ungeraden Zahlen aus 1,
, n“. Beispiel: Die Summe der ungeraden Zahlen von 1,
,10 ist 1+3+5+7+9 = 25. Erstellen Sie den Quellcode in Python fĂŒr eine Funktion, die fĂŒr einen Übergabeparameter n obige Summe mittels einer while-Schleife berechnet und den berechneten Wert zurĂŒckliefert. Rufen Sie die Funktion auf und geben das Ergebnis fĂŒr n=10 im Terminalfenster aus. Markieren Sie EinrĂŒckungen, d.h. neue Blöcke, auch bei allen anderen Aufgaben mit einem senkrechten Strich.
✅ Lösung
def ungerade(n):
│   summe = 0
│   i = 1
│   while i <= n:
│   │   summe = summe + i
│   │   i = i + 2
│   return summe

print(ungerade(10))     # Ausgabe: 25
Aufgabe #002 · 8 P. · A2 · Fehler finden und korrigierenFinden und korrigieren Sie die Fehler in folgendem Programm:

1  def summe(a, b=0):
2     return a + b + c
4  resultat1 = summe()
5  resultat2 = summe(3)
6  resultat3 = summe(3, 2, 1)
8  def summe3(a int, b int, c float = 0.0) -> float
9     return "Ergebnis: " + a + b + c
11 print(summe3(3.5, 2, 1))
13 def hallo(vorname, nachname):
14    print("Hallo ", vorname + " " + nachname)
16 hallo("Jane", "Doe")
17 hallo(vorname="Du", nachname="Da")
18 hallo(nachname="Da", vorname="Du")
19 hallo(nachname = "Du", "Da")
21 def zeigeliste(eineliste: list[int]):
22    while element in eineliste:
23        print(element)
25 zeigeliste(1, 2, 3)
26 zeigeliste([1, 2, 3])
27 zeigeliste([1,2.5,3])
✅ Lösung · Fehler pro Zeile
Zeile Fehler / Korrektur
2 return a + b + c: kein c (Variable existiert nicht)
4 summe(): mindestens ein Argument nötig
6 summe(3, 2, 1): kein 3. Argument erlaubt
8 Doppelpunkte fehlen: a: int, b: int; und : am Zeilenende
9 keine String-Addition mit Zahlen ("Ergebnis: " + a geht nicht)
11 falscher Wert 3.5 (float statt int fĂŒr a)
19 hallo(nachname = "Du", "Da"): 2. Parameter muss auch benannt werden
22 for statt while
25 zeigeliste(1, 2, 3): Listenklammern fehlen, richtig ist [1, 2, 3]
27 [1, 2.5, 3]: kein 2.5 (float in list[int])

Die Zeilen 5, 16, 17, 18, 26 sind korrekt.

Aufgabe #003 · 12 P. · A3 · AusdrĂŒcke: Ergebnis & DatentypWelche Ergebnisse und Datentypen (str, bool, int oder float) besitzen die folgenden Berechnungen?
✅ Lösung
Ausdruck Ergebnis Datentyp
not ((20 + 17) == 40) True bool
((3.3 + 7.7) != 5) and True True bool
11 // 2 + 2.1 7.1 float
(3 < 3) or (3 >= 3) True bool
(True and (x == x)) or False True bool
6.6 / 3.3 == 1.8 + 0.2 True bool
3 // 2 * 2 2 int
3 / 2 * 2 3.0 float
(13 // 3 - 3) * 10 10 int
3 + -2 * -2 % 5 7 int
menge1 is menge2 (mit {1,2} je) False bool
menge1 in menge2 False bool

Merke: / liefert immer float · % bindet so stark wie * → -2*-2%5 = 4%5 = 4 · is vergleicht Objekt-IdentitĂ€t, == den Inhalt.

Aufgabe #004 · 6 P. · A4 · Maximum in einer ListeGeben Sie den Python-Code fĂŒr folgende Aufgabe an: Ermitteln Sie das Maximum in einer Liste von beliebigen ganzen Zahlen, z. B. 3, 9, -2, 5 mittels einer Schleife, z. B. ist das Maximum im Beispiel die Zahl 9. Gibt es eine Alternative zur Bestimmung des Maximums mittels einer Standard-Funktion?
✅ Lösung
feld = [3, 9, -2, 5]
maxi = feld[0]
for element in feld:
│   if element > maxi:
│   │   maxi = element
print(maxi)          # 9

# Standard-Funktion:
print(max(feld))     # 9
Aufgabe #005 · 5 P. · A5 · Vorzeichen einer ZahlSchreiben Sie ein Python-Programm, das vom Benutzer eine ganze Zahl einliest (z. B. -5 oder 0 oder 12) und dann ausgibt, welches Vorzeichen die Zahl hat (Vorzeichen – bzw. kein Vorzeichen bzw. Vorzeichen +).
✅ Lösung
zahl = int(input("Ganze Zahl eingeben: "))

if zahl < 0:
│   print("Vorzeichen -")
elif zahl == 0:
│   print("kein Vorzeichen")
else:
│   print("Vorzeichen +")
Aufgabe #006 · 13 P. · A6 · Welche Ausgaben werden erzeugt?Welche Ausgaben werden erzeugt?
liste = ["Apfel", "Ananas", "Apfel"] · liste[2] = "Kiwi" · liste.append("Birne") · dann Ausgaben von liste, liste.index("Apfel"), liste.count("Apfel"), einer List Comprehension [n / 2 for n in range(5)], deren Durchschnitt, [n for n in range(1, 9) if n % 2 == 0] und Slice, sowie einem Dictionary lager = {"Stift": 300, "Schraube": 1_000, "Nagel": 300} mit .keys(), .values(), .get(), .update(), .pop() und einer Dictionary-Comprehension.
✅ Lösung · die exakten Ausgaben
liste = ["Apfel", "Ananas", "Apfel"]
liste[2] = "Kiwi"
liste.append("Birne")
print(liste)                # ['Apfel', 'Ananas', 'Kiwi', 'Birne']
print(liste.index("Apfel")) # 0
print(liste.count("Apfel")) # 1

zahlen = [n / 2 for n in range(5)]
print(zahlen)               # [0.0, 0.5, 1.0, 1.5, 2.0]
durchschnitt = sum(zahlen)/len(zahlen)
print(f"Durchschnitt: {durchschnitt}")  # Durchschnitt: 1.0

werte = [n for n in range(1, 9) if n % 2 == 0]
print(werte)                # [2, 4, 6, 8]
print(werte[1:3])           # [4, 6]

lager = {"Stift": 300, "Schraube": 1_000, "Nagel": 300}
print(lager.keys())         # dictkeys(['Stift', 'Schraube', 'Nagel'])
print(lager.values())       # dictvalues([300, 1000, 300])
duebel = lager.get("Duebel")
print("Anzahl Duebel: ", duebel)   # Anzahl Duebel:  None
print(lager.get("Schraube"))       # 1000

duebel = duebel - 50 if duebel != None else 0
lager.update({"Duebel": duebel, "Dichtung": 500})
lager.pop("Schraube")
print(lager)   # {'Stift': 300, 'Nagel': 300, 'Duebel': 0, 'Dichtung': 500}

temperaturen = {x: x + 20 for x in range(1, 5)}
print(temperaturen)         # {1: 21, 2: 22, 3: 23, 4: 24}
Aufgabe #007 · 8 P. · A7 · Klasse Rechteck (mit Klasse Punkt)Erstellen Sie eine Klasse Rechteck: Ein Rechteck besitzt einen Startpunkt (x/y-Koordinate), eine Breite und eine Höhe. Verwenden Sie die u. a. Klasse Punkt fĂŒr den Startpunkt. Stellen Sie eine Methode zur Initialisierung bereit. Erstellen Sie eine Methode, die die FlĂ€che des Rechtecks berechnet und als Wert liefert. Erzeugen Sie ein beliebiges Rechteck-Objekt, lassen die FlĂ€che berechnen und geben diesen Wert aus. (Gegeben: class Punkt mit __init__(self, xkoord, ykoord) und __str__.)
✅ Lösung · Punktevergabe 2/2/2/2
class Rechteck:
│   def __init__(self, startpunkt, breite, hoehe):
│   │   self.startpunkt = startpunkt
│   │   self.breite = breite
│   │   self.hoehe = hoehe
│
│   def berechne_flaeche(self):
│   │   return self.breite * self.hoehe

s = Punkt(1, 1)
rechteck = Rechteck(startpunkt=s, breite=1, hoehe=2)
print("Flaeche: ", rechteck.berechne_flaeche())   # Flaeche:  2
Aufgabe #008 · 9 P. · A8 · Funktion mit zwei RĂŒckgabewerten + ZĂ€hlerGegeben ist eine beliebige ganze Zahl n. Schreiben Sie eine Funktion, die diese Zahl durch eine andere Zahl m so lange in einer Schleife ganzzahlig teilt, bis sie kleiner als 5 ist. Die Funktion soll die Zwischenergebnisse mittels print(f"
") ausgeben. Die Funktion soll zwei Ergebnisse liefern: Das Resultat der Division und die Anzahl der SchleifendurchlĂ€ufe. Rufen Sie die Funktion auf und geben diese Ergebnisse aus. Beispiel-Ausgaben fĂŒr n=33 und m=2: n ist: 16 (1) / n ist: 8 (2) / n ist: 4 (3) / Ergebnis der Division: 4, Anzahl Iterationen: 3.
✅ Lösung
def teilen(n, m):
│   anzahldurchlaeufe = 0
│   while n >= 5:
│   │   n = n // m
│   │   anzahldurchlaeufe += 1
│   │   print(f"n ist: {n}, anzahldurchlaeufe ist: {anzahldurchlaeufe}")
│   return n, anzahldurchlaeufe

ergebnis, iterationen = teilen(33, 2)
print(f"Ergebnis der Division: {ergebnis} Anzahl Iterat.: {iterationen}")

Ausgabe: n ist: 16 
1 / n ist: 8 
2 / n ist: 4 
3 / Ergebnis der Division: 4 Anzahl Iterat.: 3

Aufgabe #009 · 16 P. · A9 · Zahlenreihen in 3 VariantenErstellen Sie folgende Zahlenreihen: (a) Auszugeben sind alle Zahlen zwischen 10 und 40, die durch 3 teilbar sind (12 15 18 21 24 27 30 33 36 39). Programmieren Sie eine while-Schleife, anschließend eine for-Schleife als ZĂ€hlschleife mittels range(
) und schließlich als dritte Variante eine List Comprehension zur Speicherung obiger Werte in einer Liste. (b) Auszugeben sind die ersten 7 Zweierpotenzen zwischen 1 und 64 (1 2 4 8 16 32 64). Es sollen alle drei Varianten aus Teil (a) programmiert werden.
✅ Lösung · 3/2/3 je Teil
# (a) Zahlen 10–40, durch 3 teilbar
start = 12
while start <= 39:
│   print(start)
│   start = start + 3

for i in range(12, 40, 3):   # stop lÀuft bis 1 davor
│   print(i)

werte = [n for n in range(12, 40) if n % 3 == 0]
print(werte)

# (b) Erste 7 Zweierpotenzen
expo = 0; basis = 2
while expo <= 6:
│   print(basis**expo)
│   expo += 1

for i in range(0, 7):
│   print(basis**i)

werte = [basis**n for n in range(0, 7)]
print(werte)
Aufgabe #010 · 11 P. · A10 · Zinseszins ĂŒber 10 JahreSchreiben Sie ein Programm, das fĂŒr eine Anlagesumme und einen bestimmten Zinssatz ausgibt, wie sich dieser Geldbetrag in 10 Jahren Jahr fĂŒr Jahr erhöht (mit Zinseszinseffekt). Ausgaben u. a.: Anlagesumme: 10000 · Zinssatz: 0.04 · Jahr: 1 hat Anlagewert: 10400.0 · 
 · Jahr: 10 hat Anlagewert: 14802.44.
✅ Lösung
anlage = 10_000
zins = 0.04
print("Anlagesumme: ", anlage)
print("Zinssatz: ", zins)
betrag = anlage
jahr = 1
while jahr <= 10:
│   zinsen = betrag * zins
│   betrag = betrag + zinsen
│   print("Jahr:", jahr, " hat Anlagewert:", round(betrag, 2))
│   jahr += 1

Alternative als for jahr in range(1, 11): mit gleichem Rumpf.

Aufgabe #011 · 9 P. · A11 · Typ-sichere Funktion: alternierende SummeSchreiben Sie eine typ-sichere Funktion, die als Übergabeparameter eine natĂŒrliche Zahl n hat und daraus mittels Schleife das Ergebnis der folgenden Summe berechnet: 1-2+3-4+5-
 Plus und minus wechseln sich also bei jeder Zahl ab. Beispiel: FĂŒr n=3 ergibt sich das Ergebnis: 1-2+3=2. Rufen Sie die Funktion auf und geben das Ergebnis aus.
✅ Lösung
def summe(n: int) -> int:
│   ergebnis = 0
│   i = 1
│   while i <= n:
│   │   vorzeichen = +1
│   │   if i % 2 == 0:
│   │   │   vorzeichen = -1
│   │   ergebnis += i * vorzeichen
│   │   i += 1
│   return ergebnis

print(summe(3))     # 2

Trick fĂŒr „abwechselnd“: i % 2 == 0 unterscheidet gerade/ungerade → Vorzeichenwechsel.

Aufgabe #012 · 9 P. · A12 · Klasse Kunde + Objekte in ListeErstellen Sie eine Klasse Kunde, bestehend aus zwei Attributen (name und ort). ErgÀnzen Sie einen Konstruktor __init__ zum Erzeugen eines Kunden, in der die Attribute mit konkreten Werten belegt werden. Schreiben Sie ein Programm, in der zwei Kundenobjekte erzeugt werden. Speichern Sie beide Kundenobjekte in einer Liste. Geben Sie nur die Namen der beiden Kunden in der Liste mittels Schleife aus.
✅ Lösung
class Kunde:
│   def __init__(self, name, ort):
│   │   self.name = name
│   │   self.ort = ort

k1 = Kunde("Jane", "Bingen")
k2 = Kunde("Alex", "Mainz")
liste = [k1, k2]
for kunde in liste:
│   print(kunde.name)     # Jane / Alex
Aufgabe #013 · 9 P. · A13 · Netto aus Brutto (MwSt)Erstellen Sie eine Python-Funktion, die mit Hilfe des Bruttopreises einer Rechnung (z. B. 100 €) und des MwSt-Satzes (19 %) als Ergebnis sowohl den MwSt-Betrag als auch den Nettopreis zurĂŒckliefert. Hinweis: Stellen Sie zunĂ€chst eine Formel auf. Testen Sie den Aufruf mit konkreten Werten und erzeugen folgende Ausgaben gerundet: Brutto: 100 MWSt-Betrag: 15.97 Netto: 84.03.
✅ Lösung

Formel: netto · 1,19 = brutto ⇒ netto = brutto / (1 + mwst)

def nettorechnung(brutto, mwst):
│   netto = brutto / (1 + mwst)
│   mwstbetrag = brutto - netto
│   return mwstbetrag, netto

brutto = 100
mwst = 0.19
mwstbetrag, netto = nettorechnung(brutto, mwst)
print("Brutto:", round(brutto, 2), "MWSt-Betrag:", round(mwstbetrag, 2),
      "Netto:", round(netto, 2))
# Brutto: 100 MWSt-Betrag: 15.97 Netto: 84.03
Aufgabe #014 · 7 P. · A14 · Alle Teiler einer ZahlSchreiben Sie ein Programm, das vom Benutzer eine Zahl einliest und hierzu alle ganzzahligen Teiler bestimmt und ausgibt (Hinweis: Operator % hilft herauszufinden, welche Teiler ohne Rest die eingegebene Zahl teilen). Die Teiler sollen in einer Liste gespeichert werden. Beispiel: Zahl eingeben: 8 → Alle Teiler: [1, 2, 4, 8].
✅ Lösung
zahl = int(input("Zahl eingeben: "))
i = 1
teiler = []
while i <= zahl:
│   if zahl % i == 0:
│   │   teiler.append(i)
│   i += 1
print("Alle Teiler:", teiler)   # Alle Teiler: [1, 2, 4, 8]

# Alternativ als List Comprehension:
liste = [i for i in range(1, zahl + 1) if zahl % i == 0]
Aufgabe #015 · 8 P. · A15 · Dictionary: Produkte & DurchschnittBefĂŒllen Sie ein Dictionary mit 2 Zuordnungen von Produkten zu Preisen: {"ProduktA": 2.00, "ProduktB": 2.50}. Geben Sie den kompletten Inhalt des Dictionary mittels for-Schleife aus (for <key> in <dictionary>). Berechnen Sie den Durchschnittspreis mittels Verwendung aller Werte des Dictionary (<dictionary>.values()). FĂŒgen Sie ein neues Element ProduktC mit Preis 1,50 hinzu mittels <dictionary>.update(
).
✅ Lösung
zuordn = {"ProduktA": 2.00, "ProduktB": 2.50}
for key in zuordn:
│   print(key + " " + str(zuordn[key]))

werte = zuordn.values()
print("Durchschnitt:", sum(werte) / len(werte))   # 2.25

zuordn.update({"ProduktC": 1.50})
print(zuordn)
Aufgabe #016 · 10 P. · A16 · Zinstabelle (Formatierung nicht gefordert)Schreiben Sie ein Programm, das aus einem Anfangskapital k = 2_000, einem Zinssatz p = 0.02 und einer Anlagedauer dauer = 3 folgende Tabelle erzeugt: Jahr / Kapital / Zinsen / Endkapital — 1 / 2000.00 / 40.00 / 2040.00 · 2 / 2040.00 / 40.80 / 2080.80 · 3 / 2080.80 / 41.62 / 2122.42. Die Formatierung mit Leerzeichen und zwei Nachkommastellen soll nicht programmiert werden.
✅ Lösung
dauer = 3
print("Jahr  Kapital  Zinsen  Endkapital")
aktjahr = 1
aktkap = k
while aktjahr <= dauer:
│   zinsen = aktkap * p
│   neueskap = aktkap + zinsen
│   print(f"{aktjahr} {aktkap} {zinsen} {neueskap}")
│   aktkap = neueskap
│   aktjahr += 1
Aufgabe #017 · 12 P. · A17 · WĂŒrfel-Statistik (List Comprehension)Entwickeln Sie ein Programm, mit dem man herausfinden kann, wie gut der Zufallsgenerator arbeitet. Es soll 600 mal gewĂŒrfelt werden, die gewĂŒrfelten Zahlen sollen in einer Liste gespeichert werden. Die Erzeugung soll mittels List Comprehension erfolgen. Berechnen und ausgeben: Wie oft wurde eine Sechs gewĂŒrfelt? Wie groß ist der Mittelwert aller WĂŒrfelergebnisse? (Hinweis: from random import randint und dann randint(1, 6).)
✅ Lösung
from random import randint

VERSUCHE = 600
liste = [randint(1, 6) for elem in range(VERSUCHE)]
anzahl6 = 0
augensumme = 0
for elem in liste:
│   augensumme += elem
│   if elem == 6:
│   │   anzahl6 += 1

print("Anzahl Sechsen:", anzahl6)
print("Durschnittl. Summe:", augensumme / VERSUCHE)
Aufgabe #018 · 6 P. · A18 · Dezimal → Single-Gleitkommazahl (18,8)Wandeln Sie folgende Zahl unter Angabe der Berechnungsschritte in eine Single-Gleitkommazahl um: 18,8. Hierbei sollen nur die ersten beiden Schritte durchgefĂŒhrt werden, d. h. die Umwandlung der Vorkommazahl in eine BinĂ€rzahl und die Umwandlung der Nachkommazahl in einen BinĂ€rbruch (Angabe von 8 Nachkommastellen).
✅ Lösung

Schritt 1: Vorkommazahl 18, Divisionsmethode (Reste von unten nach oben):

18 : 2 = 9  Rest 0   (= letzte Ziffer)
 9 : 2 = 4  Rest 1
 4 : 2 = 2  Rest 0
 2 : 2 = 1  Rest 0
 1 : 2 = 0  Rest 1   (= erste Ziffer)
→ Vorkommazahl: 10010

Schritt 2: Nachkommazahl 0,8, Multiplikationsmethode

0,8 · 2 = 1,6  → notiere 1, weiter mit 0,6
0,6 · 2 = 1,2  → notiere 1, weiter mit 0,2
0,2 · 2 = 0,4  → notiere 0
0,4 · 2 = 0,8  → notiere 0
0,8 · 2 = 1,6  → notiere 1
0,6 · 2 = 1,2  → notiere 1
0,2 · 2 = 0,4  → notiere 0
→ 0,8 dezimal = 0,1100 1100 
 binĂ€r (periodisch)

Gesamt: 18,8 = 10010,11001100
₂

Aufgabe #019 · 8 P. · A19 · Datenmodell Handwerker/BaustelleErstellen Sie ein relationales Datenmodell fĂŒr folgende Situation. ErgĂ€nzen Sie die KardinalitĂ€ten und lösen n:m-Beziehungen auf. FĂŒgen Sie PrimĂ€rschlĂŒssel- und FremdschlĂŒssel-Attribute hinzu. Ein Handwerker (Attribut: Name des Handwerkers) arbeitet auf mehreren Baustellen (Attribut: Bezeichnung der Baustelle) und auf einer Baustelle sind mehrere Handwerker tĂ€tig. Jede Baustelle hat einen Bauleiter (Attribut: Name des Bauleiters), ein Bauleiter kann mehrere Baustellen ĂŒberwachen. Ein Bauleiter kann freiberuflich tĂ€tig sein oder ein Angestellter eines Unternehmens sein. Ein Unternehmen kann mehrere Bauleiter beschĂ€ftigen. Jedes Unternehmen hat einen Namen als Unternehmensbezeichnung.
✅ Lösung

Beziehungen: Handwerker n:m Baustelle (auflösen) · Baustelle n:1 Bauleiter · Bauleiter n:1 Unternehmen.

Handwerker(HandwerkerID [PS], Name)
Einsatz(HandwerkerID [FS·PS], BaustellenID [FS·PS])   ← n:m aufgelöst
Baustelle(BaustellenID [PS], Bezeichnung, BauleiterID [FS])
Bauleiter(BauleiterID [PS], Name, UnternehmenID [FS])
Unternehmen(UnternehmenID [PS], Bezeichnung)

Freiberufler → UnternehmenID bleibt leer. Alternativ eigene Klasse „Freiberuf“ mit BauleiterID und 1:1-Beziehung (ebenfalls korrekt).

Aufgabe #020 · 8 P. · A20 · Datenmodell Online-ShopErstellen Sie ein relationales Datenmodell fĂŒr folgende Situation eines Online-Shops. ErgĂ€nzen Sie alle Beziehungen und KardinalitĂ€ten. FĂŒgen Sie alle notwendigen FremdschlĂŒssel-Attribute hinzu. Lösen Sie n:m-Beziehungen auf. Ein Kunde kann mehrere Adressen besitzen (z. B. Rechnungsadresse, Lieferadresse), aber eine Adresse ist eindeutig einem Kunden zugeordnet. Ein Kunde besitzt im Online-Shop genau einen Warenkorb. Ein Warenkorb besteht aus mehreren Artikeln, aber jeder Artikel kann auch in Warenkörbe anderer Kunden aufgenommen werden.
✅ Lösung

Beziehungen: Kunde 1:n Adresse · Kunde 1:1 Warenkorb · Warenkorb n:m Artikel (auflösen).

Kunde(KundeID [PS], Name)
Adresse(AdressID [PS], Straße, Ort, KundeID [FS])
Warenkorb(WarenkorbID [PS], KundeID [FS])
Warenkorbposition(WarenkorbID [FS·PS], ArtikelNr [FS·PS], Menge)  ← n:m aufgelöst
Artikel(ArtikelNr [PS], Bezeichnung, Preis)

Die Zuordnungstabelle kann entweder einen eigenen PS (z. B. ZuordnungsID) + 2 FS haben oder (Musterlösung) beide FS zusammen als zusammengesetzten PS → beide unterstreichen.