Seite 1 von 1

Herausfiltern des ggT zweier Elemente

Verfasst: Samstag 12. Juni 2021, 11:47
von BlowKissFireGun
Hallo liebe Forengemeinde,

ich bin's wieder die Nervensäge. Bin jetzt am Schreiben meiner ersten Programm und bin jetzt kurz vorm Abschluss beim Programm, das den größten gemeinsamen Teiler ermitteln soll aus zwei gegebenen Zahlenobjekten.
Meine Schwierigkeiten liegt im Umwandeln der Menge in eine Liste. Kann mir vielleicht bitte einmal jemand erklären, wo genau mein Fehler ist?
Ich gebe den folgenden Quelltext ein:

Code: Alles auswählen

#Herausfinden des ggT
a = int(input("Geben Sie eine Zahl a ein: "))
b = int(input("Geben Sie eine zweite Zahl b ein: "))
if a>=b and a%b == 0:
    print("Der größte gemeinsame Teiler ist: ", b)
elif b>a and b%a == 0:
    print("Der größte gemeinsame Teiler ist: ", a)
else:
    a_Teiler = []
    b_Teiler = []
    for i in range(1,a):
        if a%i == 0:
            a_Teiler.append(i)
    for i in range(1,b):
        if b%i == 0:
            b_Teiler.append(i)
            
a_Teiler = set(a_Teiler)

b_Teiler = set(b_Teiler)

def gK(a,b):
    return a_Teiler.intersection(b_Teiler)

def ggT(gK):
    gK = list(gK)
    return max(gK)

print(" gemeinsame Teiler der Zahl sind: ", gK(a,b))
print(" Der größte gemeinsame Teiler ist: ",ggT(gK))
    
In der Shell bekomme ich dann folgenden Text angezigt:

Code: Alles auswählen

Geben Sie eine Zahl a ein: 6
Geben Sie eine zweite Zahl b ein: 21
 gemeinsame Teiler der Zahl sind:  {1, 3}
Traceback (most recent call last):
  File "C:/Users/juss/AppData/Local/Programs/Python/Python39/ggT.py", line 30, in <module>
    print(" Der größte gemeinsame Teiler ist: ",ggT(gK))
  File "C:/Users/juss/AppData/Local/Programs/Python/Python39/ggT.py", line 26, in ggT
    gK = list(gK)
TypeError: 'function' object is not iterable
In der Funktion, die die größte Komponente der Schnittmenge der beiden Teilmengen bestimmen soll, läuft etwas schief. Nur weiß ich leider als kompletter Neuanfänger nicht was. :roll: :?

Re: Herausfiltern des ggT zweier Elemente

Verfasst: Samstag 12. Juni 2021, 12:05
von rogerb
Nur eine Kleinigkeit:

Du versuchst aus der Funktion selbst eine Liste zu machen. Das funktioniert nicht.
So währe es richtig:

Code: Alles auswählen

gK = list(gK(a,b))

Re: Herausfiltern des ggT zweier Elemente

Verfasst: Samstag 12. Juni 2021, 12:21
von rogerb
Ich würde das Ganze auch noch etwas restrukturieren:
In der Funktion gK werden die Eingangsparameter a, b gar nicht verwendet.
Die Funktionen anders aufteilen in:
- Benutzereingabe der Werte
- Berechnung der Teiler einer Zahl
- Berechnung des ggT aus den Teilern
- Ausgabe der Ergebnisse

Zur Zeit haben die Funktionen teilweise gemischte Aufgaben.

Re: Herausfiltern des ggT zweier Elemente

Verfasst: Samstag 12. Juni 2021, 12:26
von BlowKissFireGun
Wow, das funktioniert. Bin sprachlos. Und umstrukturieren werde ich es noch. Danke dir :)

Re: Herausfiltern des ggT zweier Elemente

Verfasst: Samstag 12. Juni 2021, 12:54
von Sirius3
Alles, was eine Funktion braucht, sollte sie auch über ihre Argumente bekommen, in `gK` kommen `a_Teiler` und `b_Teiler` aus dem nichts. Benutze keine kryptischen Abkürzungen, ich habe keine Ahnung, was gK bedeuten soll?
Die Funktion ggT hat auch ein komisches Argument. Größter gemeinsamer Teile bekommt schon eine Liste an Teilern? Dann müßte die Zahl gT heißten, also größter_teiler.
Sowohl Funktionen als auch Variablennamen schreibt man komplett klein.
Man vermeidet eigentlich, doppelten Code zu haben, das Berechnen von den Teilern von a ist aber identisch zur Berechnung der Teiler von b.
Es gibt deutlich effizientere Algorithmen zum Berechnen aller Teiler und deutlich effizientere Algorithmen zum berechnen des größten gemeinsamen Teilers.