===== Musterlösungen ===== ==== Aufgabe 1 ==== === Aufgabenteil a (4 Punkte) === Gefordert war hier nicht eine Eingabemöglichkeit. Möglich ist auch eine Festlegung auf genau 10 Arrayelemente, was den Einsatz der range()-Funktion obsolet macht. Möglich sind auch **for each** oder **while-Schleifen**. # Beispielarray sum_array = [89,45,5,67,78,97,45,4,8,12] # Anzahl der Elemente bestimmen, um die Laufweite für eine Schleife zu ermitteln elements_count = len(sum_array) # Variable zur Berechnung der Summe array_sum = 0 # Durch das Array laufen und jedes Element auf array_sum aufaddieren for i in range (0,elements_count): array_sum = array_sum + sum_array[i] # Ausgabe des Ergebnisses print(array_sum) === Aufgabenteil b (6 Punkte) === Es sind natürlich alternative Lösungen möglich, da die Aufgabe ungenau gestellt war. So konnte man z.B. die beiden Arrays einfach wild mergen und hinterher sortieren. Ich hätte im Prinzip aber sowas gewollt: first_array = [0,2,4,6,8,10] second_array = [1,3,5,7,9,11] # Array zur Aufnahme der Elemente der beiden anderen Arrays merged_array = [] # Anzahl der Elemente in beiden Arrays bestimmen # 1b läuft sonst nicht # für 1c bräuchte man das sowieso elements_count_first = len(first_array) elements_count_second = len(second_array) # Wir prüfen, ob beiden Arrays gleich viele Elemente enthalten if (elements_count_first == elements_count_second): # Wenn ja, hängen wir nacheinander die Elemente vom ersten und zweiten Array an for i in range(0,elements_count_first): merged_array.append(first_array[i]) merged_array.append(second_array[i]) # Ausgabe des neuen Arrays zur Kontrolle print(merged_array) # Wenn beide Arrays ungleiche Anzahlen von Elementen enthalten, brechen wir ab else: print("Arrays enthalten nicht gleich viele Elemente. Abbruch.") === Aufgabenteil c (4 Zusatzpunkte) === Das Hauptproblem ist die Laufweite in der for-Schleife. Beim kleineren Array muss man früher aufhören. Diese Lösung sortiert nur sehr eingeschränkt. Man kann des Array später z.B. noch durch Bubblesort schicken, dann wäre das Ergebnisarray auf jeden Fall sortiert. first_array = [0,2,3,6,8,10] second_array = [1,3,5,7,9,11] # Array zur Aufnahme der Elemente der beiden anderen Arrays merged_array = [] # Anzahl der Elemente in beiden Arrays bestimmen # 1b läuft sonst nicht # für 1c bräuchte man das sowieso elements_count_first = len(first_array) elements_count_second = len(second_array) # Wir prüfen, ob beiden Arrays gleich viele Elemente enthalten if (elements_count_first == elements_count_second): # Wenn ja, hängen wir nacheinander die Elemente vom ersten und zweiten Array an for i in range(0,elements_count_first): merged_array.append(first_array[i]) merged_array.append(second_array[i]) ################################################################################## (bekannt, s.o.) # Wenn beide Arrays ungleiche Anzahlen von Elementen enthalten, müssen wir anders vorgehen # Sonst laufen wir z.B. in der Schleife über die Anzahl der Elemente heraus else: # Wir schauen, welches Array das größere ist # ... und setzen einen Zeiger entsprechend # smaller ist jetzt das kleinere, bigger des größere Array # Man kann damit genau so arbeiten wie mit den Ursprungsarrays if (elements_count_first > elements_count_second): bigger = first_array smaller = second_array else: smaller = first_array bigger = second_array # die erforderliche Laufweite wird durch das größere Array bestimmt for i in range(0,len(bigger)): # nur ausführen, wenn es noch Elemente im kleineren Array gibt if i < len(smaller): # Damit es sortiert bleibt, müssen wir schauen, welches Array an der Stelle i # das jeweils kleinere Element enthält und in dieser Reihenfolge mergen if (smaller[i] < bigger[i] ): merged_array.append(smaller[i]) merged_array.append(bigger[i]) else: merged_array.append(bigger[i]) merged_array.append(smaller[i]) # Sonst hängen wir einfach die Elemente des größeren Arrays hintereinander weg else: merged_array.append(bigger[i]) # Ausgabe des neuen Arrays zur Kontrolle print(merged_array) ===== Aufgabe 2 ===== === Aufgabenteil a (4 Punkte) ==== Diese Aufgabe ist im Prinzip nur etwas Schreibarbeit. Zur Sicherheit sollte man beim Bauen der Sterne im Programmcode den richtigen Datentyp beachten. class Star: # Attribute des Stern 1:1 aus Aufgabe umsetzen def __init__(self, name, id, distance, apparentMagnitude, type): self.name = name self.id = id self.distance = distance self.apparentMagnitude = apparentMagnitude self.type = type # Vorgegebene Sterne bauen # Dabei beim Anlegen auf die Datentypen achten (z.B. 2000.0 statt 2000) star01 = Star("Sirius","TYC 5949-2777-1", 8.6, -1.46, "Main sequence") star02 = Star("Alpha Centauri","TYC 9007-5849-1", 4.37, -0.27, "Main sequence") star03 = Star("Rigel","TYC 5331-1752-1", 860.0, 0.13, "Blue supergiant") star04 = Star("Almaaz","TYC 2907-1275-1", 2000.0, 2.92, "Yellow supergiant") star05 = Star("Luhmann 16","WISE J1049-5319A", 6.589, 14.94, "Brown dwarf") === Aufgabenteil b (4 Punkte) ==== Die Methoden in der Klasse sind nicht so komplex, gerne vergisst man den self-Parameter. Ich habe hier im Hauptprogramm eine Hilfsmethode geschrieben, den den Vergleich unterschiedlicher Sterne vereinfacht. Das ist kein Muss. class Star: # Attribute des Stern 1:1 aus Aufgabe umsetzen def __init__(self, name, id, distance, apparentMagnitude, type): self.name = name self.id = id self.distance = distance self.apparentMagnitude = apparentMagnitude self.type = type # Es muss der Vergleichstern übergeben werden, auf die eigene Distanz hat man Zugriff über self def isCloserThan(self,star_other): if (self.distance < star_other.distance): return True else: return False # Eine einfache Division reicht als Rückgabewert def getDistanceInPC(self): return self.distance/3.26 # Hilfsmethode, um beliebige Sterne vergleichen zu können def compareDistance(first_star, second_star): if (first_star.isCloserThan(second_star)): print(f'{first_star.name} ist näher an der Sonne als {second_star.name}.') else: print(f'{second_star.name} ist näher an der Sonne als {first_star.name}.') # Mainmethode # Vorgegebene Sterne bauen # Dabei beim Anlegen auf die Datentypen achten (z.B. 2000.0 statt 2000) star01 = Star("Sirius","TYC 5949-2777-1", 8.6, -1.46, "Main sequence") star02 = Star("Alpha Centauri","TYC 9007-5849-1", 4.37, -0.27, "Main sequence") star03 = Star("Rigel","TYC 5331-1752-1", 860.0, 0.13, "Blue supergiant") star04 = Star("Almaaz","TYC 2907-1275-1", 2000.0, 2.92, "Yellow supergiant") star05 = Star("Luhmann 16","WISE J1049-5319A", 6.589, 14.94, "Brown dwarf") # Tests print(star01.getDistanceInPC()) compareDistance(star01,star02) === Aufgabenteil c (6 Punkte) ==== Hier gibt es Punkte für jeden Ansatz. Schwierig zu begreifen ist, dass man eigentlich keinen Konstruktor braucht, da ja nur ein klasseninternes Array verwaltet wird. Diese Lösung hier hat natürlich Probleme, z.B. wird gar nicht geprüft, ob ein Stern überhaupt in der Datenbank existiert, wenn man ihn löscht. Da lässt sich beliebig viel weiterer Hirnschmalz hineinstecken. Die get-Methode sollte wahrscheinlich besser in der Stars-Klasse realisiert werden. class Star: # Attribute des Stern 1:1 aus Aufgabe umsetzen def __init__(self, name, id, distance, apparentMagnitude, type): self.name = name self.id = id self.distance = distance self.apparentMagnitude = apparentMagnitude self.type = type # Es muss der Vergleichstern übergeben werden, auf die eigene Distanz hat man Zugriff über self def isCloserThan(self,star_other): if (self.distance < star_other.distance): return True else: return False # Eine einfache Division reicht als Rückgabewert def getDistanceInPC(self): return self.distance/3.26 class StarsDatabase: # Wir brauchen keinen Konstruktor, sondern nur ein Array ("index"), was wir verwalten index = [] # Neue Sterne einfach an unser Array anhängen def add(self,star): self.index.append(star) return # Löschen ist genauso einfach (Achtung: Man müsste vorher prüfen, ob es den Stern überhaupt in der Datenbank gibt! def remove(self,star): self.index.remove(star) print(f'Stern {star.name} gelöscht.') return # Die Funktion greift nicht auf die Datenbank zu, sollte damit besser in der Stars-Klasse realisiert werden def get(self, star): print("Hier die Daten des Sterns:") print(star.name) print(star.id) print(star.distance) print(star.apparentMagnitude) print(star.type) return # Hier einfach die Länge des Index-Arrays zurückgeben def size(self): print(f'Es gibt {len(self.index)} Sterne in der Datenbank.') return # Mainmethode # Vorgegebene Sterne bauen # Dabei beim Anlegen auf die Datentypen achten (z.B. 2000.0 statt 2000) star01 = Star("Sirius","TYC 5949-2777-1", 8.6, -1.46, "Main sequence") star02 = Star("Alpha Centauri","TYC 9007-5849-1", 4.37, -0.27, "Main sequence") star03 = Star("Rigel","TYC 5331-1752-1", 860.0, 0.13, "Blue supergiant") star04 = Star("Almaaz","TYC 2907-1275-1", 2000.0, 2.92, "Yellow supergiant") star05 = Star("Luhmann 16","WISE J1049-5319A", 6.589, 14.94, "Brown dwarf") # Tests # Erzeugen der Datenbank milchstrasse = StarsDatabase() # Sterne hinzufügen milchstrasse.add(star01) milchstrasse.add(star02) milchstrasse.add(star03) milchstrasse.add(star04) milchstrasse.add(star05) # Überprüfen des Hinzufügens milchstrasse.size() # Stern löschen milchstrasse.remove(star01) # Überprüfen des Löschens milchstrasse.size() # Daten eines Sterns ausgeben milchstrasse.get(star04)